iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0

雖然標題上跟官方文件的標題都是 Signal & Slot, 但是 Signal & Slot 之間還有一個重要功能叫 emit()
以字面上翻譯的話, Signal(訊號), Slot(訊號槽), emit(發送), 以字面上來看就是今天我們手上有個訊號想要發送給某個訊號槽

以我自己的理解的話, 就像是門, 門鎖和鑰匙, 如果我們要進到某間房間裡的話, 需要先有正確的鑰匙打開目的房間的門鎖, 之後才能打開門進到房間裡。

我們把昨天的 Hello world 稍微修改一下

import sys
from PySide6 import QtCore, QtWidgets
class HelloWorld(QtCore.QObject):
    sayHello = QtCore.Signal(str)

class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.label = HelloWorld()
        self.text = QtWidgets.QLabel("Hello ",
                                    alignment=QtCore.Qt.AlignCenter)
        self.label.sayHello.connect(self.magic)
        self.label.sayHello.emit("World!")
        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.addWidget(self.text)

    @QtCore.Slot(str)
    def magic(self, sayTo: str):
        strOut = "Hello " + sayTo
        self.text = QtWidgets.QLabel(strOut,
                                    alignment=QtCore.Qt.AlignCenter)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = MyWidget()
    widget.resize(300, 300)
    widget.show()

    sys.exit(app.exec())

https://ithelp.ithome.com.tw/upload/images/20220904/20151144QnoL5ScqA2.png
可以看到我們初始的 text 只有 Hello 而已, 但是設定 Signal, connect, emit 跟 Slot 後, 可以得到跟官方最初範例 Hello, world! 一樣的結果。

回到開頭我舉的例子, Signal 就像是鑰匙, Slot 就像是鑰匙孔, 它們後面伴隨的變數就是鑰匙跟鑰匙孔的形狀, 如果其中一個沒有對上就會開門失敗。

但其實多玩玩的話, 把 Day01 最後的程式碼跟上方程式碼裡, @QtCore.Slot() 刪除, 程式可以正常執行且跟刪除前無異。在這兩個例子中 connect 這個功能非常非常重要。
明天就讓我們讓 Slot 發揮他的強大功用吧!


上一篇
【Day01】Hello PySide
下一篇
【Day03】Signal & Slot 續
系列文
[Python QT] 玩玩 Pyside 的各種功能31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言